剑指offer二之替换空格
一、题目:
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为I love you.则经过替换之后的字符串为I%20love%20You。
二、解题方法:
方法1:采用String的repalceAll方法
public class Reword { public static void main(String[] args) { StringBuffer str = new StringBuffer("I love you"); String str_new = replaceSpace(str); System.out.println(str_new); } private static String replaceSpace(StringBuffer str) { String str_new = str.toString().replaceAll(" ", "20%"); return str_new; } }
方法2:创建新的字符串,将旧的字符串一次放入新的字符串,当遇到空格的时候,进行替换
public class Reword { public static void main(String[] args) { StringBuffer str = new StringBuffer("I love you"); String str_new = replaceSpace(str); System.out.println(str_new); } private static String replaceSpace(StringBuffer str) { if (str == null) { return null; } StringBuilder stb = new StringBuilder(); for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == ' ') { //遇到空格 stb.append('%'); stb.append('2'); stb.append('0'); } else { stb.append(str.charAt(i)); } } return stb.toString(); } }
方法3:先遍历查询所有的空格数量,然后从字符串的后面往前进行遍历替换
public class Reword { public static void main(String[] args) { StringBuffer str = new StringBuffer("I love you"); String str_new = replaceSpace(str); System.out.println(str_new); } private static String replaceSpace(StringBuffer str) { //从后往前替换 int numspace = 0;//空格数 for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == ' ')//遇到空格 numspace++; } int oldindex = str.length() - 1;//替换前下标 int newlength = str.length() + numspace * 2;//替换之后str长度,z注意乘以2,而不是3 int newindex = newlength - 1;//替换后下标 str.setLength(newlength);//扩展长度 for (; oldindex >= 0 && oldindex < newlength; oldindex--) { if (str.charAt(oldindex) == ' ') { /*遇到空格进行替换(从后向前)*/ str.setCharAt(newindex--, '0'); str.setCharAt(newindex--, '2'); str.setCharAt(newindex--, '%'); numspace--;//空格数量减1 if (numspace == 0) break;//空格填完,跳出循环 } else { str.setCharAt(newindex--, str.charAt(oldindex)); } } return str.toString(); } }
附:StringBuffer的用法
1、StringBuffer对象的初始化
StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。例如:
StringBuffer s = new StringBuffer();
这样初始化出的StringBuffer对象是一个空的对象,就是我犯的错误。如果需要创建带有内容的StringBuffer对象,则可以使用:
StringBuffer s = new StringBuffer(“abc”);
这样初始化出的StringBuffer对象的内容就是字符串”abc”。需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:
StringBuffer s = “abc”; //赋值类型不匹配
StringBuffer s = (StringBuffer)”abc”; //不存在继承关系,无法进行强转
StringBuffer对象和String对象之间的互转的代码如下:
String s = “abc”;
StringBuffer sb1 = new StringBuffer(“123”);
StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer
String s1 = sb1.toString(); //StringBuffer转换为String
2、StringBuffer的常用方法
StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。
(1)append方法
public StringBuffer append(boolean b)
该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);
则对象sb的值将变成”abctrue”。使用该方法进行字符串的连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,例如:
StringBuffer sb = new StringBuffer();
String user = “test”;
String pwd = “123”;
sb.append(“select * from userInfo where username=“) .append(user).append(“ and pwd=”).append(pwd);
这样对象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。
(2)deleteCharAt方法
public StringBuffer deleteCharAt(int index)
该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“Test”);
sb. deleteCharAt(1);
该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变为”Tst”。还存在一个功能类似的delete方法:
public StringBuffer delete(int start,int end)
该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);
该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。
(3)insert方法
public StringBuffer insert(int offset, boolean b)
该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,false);
该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。
(4)reverse方法
public StringBuffer reverse()
该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
经过反转以后,对象sb中的内容将变为”cba”。
(5)setCharAt方法
public void setCharAt(int index, char ch)
该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);
则对象sb的值将变成”aDc”。
(6)trimToSize方法
public void trimToSize()
该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。
总之,在实际使用时,String和StringBuffer各有优势和不足,可以根据具体的使用环境,选择对应的类型进行使用。
参考链接:http://www.cnblogs.com/liu-chao-feng/p/5636063.html
http://blog.csdn.net/qq_28796345/article/details/68948358